package repositories

import (
	"context"
	"github.com/qiniu/go-sdk/v7/auth/qbox"
	"github.com/qiniu/go-sdk/v7/storage"
	"mime/multipart"
	"net/http"
	"new_ginblog/config"
	"new_ginblog/internal/utils/errormsg"
)

var AccessKey = config.AccessKey
var SecretKey = config.SecretKey
var Bucket = config.Bucket
var ImgUrl = config.QiniuServer

// UpLoadFile 上传文件的函数 返回一个访问文件的url路径和一个状态码
func UpLoadFile(file multipart.File, fileSize int64) (string, int) {
	// 1. 创建上传策略（指定文件存储的空间）
	putPolicy := storage.PutPolicy{
		Scope: Bucket, // Bucket 是七牛云存储空间名称，文件将上传到这个空间
	}

	// 2. 生成上传凭证（基于AccessKey和SecretKey进行身份验证）
	mac := qbox.NewMac(AccessKey, SecretKey) // 初始化七牛云身份认证
	upToken := putPolicy.UploadToken(mac)    // 生成上传令牌（临时授权凭证）

	// 3. 配置上传参数（指定存储区域等）
	cfg := storage.Config{
		Zone:          &storage.ZoneHuabei, // 指定存储区域为华北（河北）
		UseCdnDomains: false,               // 是否使用CDN加速域名（上传阶段通常设为false）
		UseHTTPS:      false,               // 是否使用HTTPS协议上传（根据需求调整）
	}

	// 4. 初始化上传器和返回结果对象
	putExtra := storage.PutExtra{}                // 额外上传参数（如自定义元数据等，这里用默认值）
	formUploader := storage.NewFormUploader(&cfg) // 创建表单上传器
	ret := storage.PutRet{}                       // 用于接收上传后的返回结果（如文件Key等）

	// 5. 执行文件上传（无指定文件名，由七牛云自动生成唯一Key）
	// PutWithoutKey：无需指定文件名，七牛云会自动生成唯一的Key标识文件
	// 参数依次为：上下文、返回结果、上传令牌、文件内容、文件大小、额外参数
	err := formUploader.PutWithoutKey(context.Background(), &ret, upToken, file, fileSize, &putExtra)

	// 6. 处理上传错误
	if err != nil {
		return "", errormsg.ERROR // 上传失败，返回错误码
	}

	// 7. 拼接文件访问URL（七牛云域名 + 文件唯一标识Key）
	// ImgUrl 是七牛云空间绑定的域名（如 http://xxx.clouddn.com）
	// ret.Key 是七牛云为文件生成的唯一标识（上传成功后返回）
	url := ImgUrl + ret.Key // 最终访问URL格式：http://域名/文件Key

	// 8. 返回成功上传的文件URL和成功状态码
	return url, http.StatusOK
}
